<?php
namespace Framework\Library\Core;


class FileSystem{
	
	private $dir;

	function __construct($config){
		
		$this ->dir = $config ->FsDir;

		if ( !is_dir($this ->dir) ) throw new \Exception( __CLASS__.'的实例对象创建时失败，'.$this ->dir.' 不是一个目录。');
		
	}
		
	/**
	 * 保存数据包到文件系统，并返回文件的相对路径，只存失败时返回FALSE
	 * @param unknown $file 要保存到本系统的文件的路径，如PHP收到的已上传文件的临时文件
	 * @throws \Exception
	 * @return string|boolean
	 */
	public function savePackage( $file ){
	  	
	  	if ( !file_exists($file) ) throw new \Exception('文件 '.$file.' 不存在而失败。');
	  	if ( !filesize($file) ) throw new \Exception('文件 '.$file.' 大小为0字节而失败。');
	  	
	  	$today = getdate();
	  	
	  	$sub_dir = $today['year'].'-'.$today['mon'];
	  	
	  	if ( !is_dir($this ->dir.'/'.$sub_dir) )
	  	if ( !mkdir($this ->dir.'/'.$sub_dir) ) throw new \Exception( '尝试创建目录 '.$this ->dir.'/'.$sub_dir.' 失败。');
	  	
	  	$file_info = pathinfo( $file );
	  	$unique_name = $today['mday'].'-'.$today['hours'].'-'.$today['minutes'].'-'.$today['seconds'];
	  	while( file_exists($this ->dir.'/'.$sub_dir.'/'.$unique_name) ) $unique_name .= '-'.rand(1000);
	  	
	  	$des_file = $sub_dir.'/'.$unique_name;
	  	
	  	if (copy( $file, $this ->dir.'/'.$des_file )) return $des_file;
	  	else return false;
	  	
	}
	
	/**
	 * 读取文件二进制数据
	 * @param string $file 文件路径，由savePackage方法返回的
	 * @return bin
	 */
	public function getPackage($file){
		
		$file = $this ->dir.'/'.$file;
		
		$handle = fopen($file, "rb");
		$contents = fread($handle, filesize($file));
		fclose($handle);
		
		return $contents;
		
	}
	  
	/**
	 * 删除已保存到文件系统的文件包，成功返回TRUE，失败返回FALSE
	 * @param unknown $file 要删除的文件包的路径，由savePackage方法返回的
	 * @return boolean
     */
	public function deletePackage( $file ){
	  	
	  	
		  if ( file_exists($this ->dir.'/'.$file) ){
			  $state = unlink($this ->dir.'/'.$file);
		  }else{
		  	$state = true;
		  }
		
		  $path_info = pathinfo( $this ->dir.'/'.$file );
		  
		  $file_list = scandir($path_info['dirname']);
		  if (count($file_list) == 2) rmdir($path_info['dirname']); //rmdir 要求目录必须为空，否则不会删除目录
		
		  return $state;
		
	}
	
}
  